Expand description
§Rust GTK 4 bindings
The project website is here.
Rust bindings of GTK 4, part of gtk4-rs.
This library contains safe Rust bindings for GTK 4, a multi-platform GUI toolkit. It is a part of gtk-rs.
Most of this documentation is generated from the C API. Until all parts of the documentation have been reviewed there will be incongruities with the actual Rust API.
For a gentle introduction to gtk-rs we recommend the online book GUI development with Rust and GTK 4.
See also:
- gtk-rs project overview
- General
GLib
family types and object system overview - GTK documentation
- GTK Visual Index
§Minimum supported Rust version
Currently, the minimum supported Rust version is 1.70
.
§“Hello, World!” example program
GTK needs to be initialized before use by calling init
. Creating an
Application
will call init
for you.
The gtk4
crate is usually renamed to gtk
. You can find an example in
the features section for how to do this globally in your Cargo.toml
.
use gtk4 as gtk;
use gtk::prelude::*;
use gtk::{glib, Application, ApplicationWindow};
fn main() -> glib::ExitCode {
let app = Application::builder()
.application_id("org.example.HelloWorld")
.build();
app.connect_activate(|app| {
// We create the main window.
let window = ApplicationWindow::builder()
.application(app)
.default_width(320)
.default_height(200)
.title("Hello, World!")
.build();
// Show the window.
window.present();
});
app.run()
}
§The main loop
In a typical GTK application you set up the UI, assign signal handlers and run the main event loop.
use gtk4 as gtk;
use gtk::prelude::*;
use gtk::{glib, Application, ApplicationWindow, Button};
fn main() -> glib::ExitCode {
let application = Application::builder()
.application_id("com.example.FirstGtkApp")
.build();
application.connect_activate(|app| {
let window = ApplicationWindow::builder()
.application(app)
.title("First GTK Program")
.default_width(350)
.default_height(70)
.build();
let button = Button::with_label("Click me!");
button.connect_clicked(|_| {
eprintln!("Clicked!");
});
window.set_child(Some(&button));
window.present();
});
application.run()
}
§Threads
GTK is not thread-safe. Accordingly, none of this crate’s structs implement
Send
or Sync
.
The thread where init
was called is considered the main thread. OS X has
its own notion of the main thread and init
must be called on that thread.
After successful initialization, calling any gtk
or gdk
functions (including init
) from other threads will panic
.
Any thread can schedule a closure to be run by the main loop on the main
thread via glib::idle_add
or
glib::timeout_add
. While
working with GTK you might need the glib::idle_add_local
or glib::timeout_add_local
version without the
Send
bound. Those may only be called from the main thread.
§Panics
The gtk
and gdk
crates have some run-time safety and contract
checks.
-
Any constructor or free function will panic if called before
init
or on a non-main thread. -
Any
&str
or&Path
parameter with an interior null (\0
) character will cause a panic. -
Some functions will panic if supplied out-of-range integer parameters. All such cases will be documented individually but they are not yet.
-
A panic in a closure that handles signals or in any other closure passed to a
gtk
function will abort the process.
§Features
§Library versions
By default this crate provides only GTK 4.0 APIs. You can access additional
functionality by selecting one of the v4_2
, v4_4
, etc. features.
Cargo.toml
example:
[dependencies.gtk]
package = "gtk4"
version = "0.x.y"
features = ["v4_2"]
Take care when choosing the version to target: some of your users might not have easy access to the latest ones. The higher the version, the fewer users will have it installed.
§Documentation
- The Rust API Stable/Development
- Book Stable/Development
- Examples
- The C API
- GTK Installation Instructions
§Using
We recommend using crates from crates.io, as demonstrated here.
If you want to track the bleeding edge, use the git dependency instead:
[dependencies]
gtk = { git = "https://github.com/gtk-rs/gtk4-rs.git", package = "gtk4" }
Avoid mixing versioned and git crates like this:
# This will not compile
[dependencies]
gdk = {version = "0.1", package = "gdk4"}
gtk = { git = "https://github.com/gtk-rs/gtk4-rs.git", package = "gtk4" }
§Features
Feature | Description |
---|---|
v4_16 | Enable the new APIs part of GTK 4.16 |
v4_14 | Enable the new APIs part of GTK 4.14 |
v4_12 | Enable the new APIs part of GTK 4.12 |
v4_10 | Enable the new APIs part of GTK 4.10 |
v4_8 | Enable the new APIs part of GTK 4.8 |
v4_6 | Enable the new APIs part of GTK 4.6 |
v4_4 | Enable the new APIs part of GTK 4.4 |
v4_2 | Enable the new APIs part of GTK 4.2 |
gnome_46 | Enable all version feature flags of this crate and its dependencies to match the GNOME 46 SDK |
gnome_45 | Enable all version feature flags of this crate and its dependencies to match the GNOME 45 SDK |
gnome_44 | Enable all version feature flags of this crate and its dependencies to match the GNOME 44 SDK |
gnome_43 | Enable all version feature flags of this crate and its dependencies to match the GNOME 43 SDK |
gnome_42 | Enable all version feature flags of this crate and its dependencies to match the GNOME 42 SDK |
unsafe-assume-initialized | Disable checks that gtk is initialized, for use in C ABI libraries |
xml_validation | Enable xml_validation feature of gtk4-macros |
blueprint | Enable blueprint feature of gtk4-macros |
§See Also
§License
The Rust bindings of gtk4 are available under the MIT License, please refer to it.
Re-exports§
pub use subclass::widget::TemplateChild;
pub use cairo;
pub use ffi;
pub use gdk;
pub use gdk_pixbuf;
pub use gio;
pub use glib;
pub use graphene;
pub use gsk;
pub use pango;
Modules§
- Builder pattern types.
- Traits intended for blanket imports.
- Traits intended for creating custom types.
Structs§
- AccessibleList
v4_14
- AccessibleRange
v4_10
- AlertDialog
v4_10
- AppChooserDeprecated
- AppChooserButtonDeprecated
- AppChooserDialogDeprecated
- AppChooserWidgetDeprecated
- AssistantDeprecated
- AssistantPageDeprecated
- An implementation of
BuilderScope
that can bind Rust callbacks. - CellAreaDeprecated
- CellAreaBoxDeprecated
- CellAreaContextDeprecated
- CellEditableDeprecated
- CellLayoutDeprecated
- CellRendererDeprecated
- CellRendererAccelDeprecated
- CellRendererComboDeprecated
- CellRendererPixbufDeprecated
- CellRendererProgressDeprecated
- CellRendererSpinDeprecated
- CellRendererSpinnerDeprecated
- CellRendererTextDeprecated
- CellRendererToggleDeprecated
- CellViewDeprecated
- ColorButtonDeprecated
- ColorChooserDeprecated
- ColorChooserDialogDeprecated
- ColorChooserWidgetDeprecated
- ColorDialog
v4_10
- ColorDialogButton
v4_10
- ColumnViewCell
v4_12
- ColumnViewRow
v4_12
- ColumnViewSorter
v4_10
- ComboBoxDeprecated
- ComboBoxTextDeprecated
- DialogDeprecated
- EntryCompletionDeprecated
- FileChooserDeprecated
- FileChooserDialogDeprecated
- FileChooserNativeDeprecated
- FileChooserWidgetDeprecated
- FileDialog
v4_10
- FileLauncher
v4_10
- FontButtonDeprecated
- FontChooserDeprecated
- FontChooserDialogDeprecated
- FontChooserWidgetDeprecated
- FontDialog
v4_10
- FontDialogButton
v4_10
- GraphicsOffload
v4_14
- IconViewDeprecated
- InfoBarDeprecated
- Inscription
v4_8
- ListHeader
v4_12
- ListScrollFlags
v4_12
- ListStoreDeprecated
- LockButtonDeprecated
- MessageDialogDeprecated
- PageSetupUnixDialogLinux
- PrintCapabilitiesLinux
- PrintDialog
v4_14
- PrintJobLinux
- PrintSetup
v4_14
- PrintUnixDialogLinux
- PrinterLinux
- ScrollInfo
v4_12
- SectionModel
v4_12
- StatusbarDeprecated
- StyleContextDeprecated
- TreeDragDestDeprecated
- TreeDragSourceDeprecated
- TreeModelDeprecated
- TreeModelFilterDeprecated
- TreeModelFlagsDeprecated
- TreeModelSortDeprecated
- TreeSelectionDeprecated
- TreeSortableDeprecated
- TreeStoreDeprecated
- TreeViewDeprecated
- TreeViewColumnDeprecated
- UriLauncher
v4_10
- VolumeButtonDeprecated
Enums§
- Collation
v4_10
- ContentFit
v4_8
- DialogError
v4_10
- FontLevel
v4_10
- FontRendering
v4_16
- ListTabBehavior
v4_12
- NaturalWrapMode
v4_6
- SortColumnDeprecated
- SymbolicColor
v4_6
Constants§
Statics§
Functions§
- enumerate_printersLinux
- Tries to initialize GTK.
- Returns
true
if GTK has been initialized. - Returns
true
if GTK has been initialized and this is the main thread. - render_activityDeprecated
- render_arrowDeprecated
- render_backgroundDeprecated
- render_checkDeprecated
- render_expanderDeprecated
- render_focusDeprecated
- render_frameDeprecated
- render_handleDeprecated
- render_iconDeprecated
- render_layoutDeprecated
- render_lineDeprecated
- render_optionDeprecated
- Informs this crate that GTK has been initialized and the current thread is the main one.
- show_uriDeprecated
- show_uri_fullDeprecated
- show_uri_full_futureDeprecated
- tree_create_row_drag_contentDeprecated
- tree_get_row_drag_dataDeprecated